/**
 * @file Task.c
 * @author lhc (liuhc_lhc@163.com)
 * @brief  任务管理模块
 * @version 0.2
 * @date 2024-01-28
 *
 * @copyright Copyright (c) 2024
 *
 */

#include "Task.h"
#include <stdio.h>
/**
 * @brief 任务状态枚举
 *
 */
typedef enum
{
	kTaskSleep = 0,
	kTaskRun, // 运行状态
} EN_TASK_T;

// 最大任务数量枚举
enum
{
	TASK_NUM_MAX = 32, //@todo 修改这里切换最多任务数量
};

/**
 * @brief 任务结构体
 *
 */
typedef struct
{
	uint32_t ulTaskCycle;		 // 运行周期
	uint16_t usTaskCount;		 // 计数值
	EN_TASK_T enTaskState;		 // 当前状态
	VoidVoidFuncPtr ptrTaskFunc; // 执行函数
	uint8_t ucId;				 // 任务ID
} STR_TASK_T;

static STR_TASK_T stTaskBuff[TASK_NUM_MAX] = {0};

/**
 * @brief 主函数循环调用函数
 *
 */
void TaskMessage(void)
{
	STR_TASK_T *pstTask = stTaskBuff; // Pointer to stTask
	for (int i = 0; i < TASK_NUM_MAX && pstTask[i].ucId != 0; ++i)
	{
		if (pstTask[i].enTaskState == kTaskRun &&
			pstTask[i].ptrTaskFunc != NULL)
		{
			pstTask[i].enTaskState = kTaskSleep;
			pstTask[i].ptrTaskFunc();
		}
	}
}

/**
 * @brief 定时器中断周期调用函数
 *
 */
void TaskCount(void)
{
	STR_TASK_T *pstTask = stTaskBuff; // Pointer to stTask
	for (int i = 0; i < TASK_NUM_MAX && pstTask[i].ucId != 0; ++i)
	{
		++pstTask[i].usTaskCount;
		if (pstTask[i].usTaskCount >= pstTask[i].ulTaskCycle)
		{
			pstTask[i].usTaskCount = 0;		   // 重新计数
			pstTask[i].enTaskState = kTaskRun; // 此任务转为运行状态
		}
	}
}

/**
 * @brief 任务添加函数
 *
 * @param ptrTaskFunc 任务执行函数
 * @param ulTaskCycle 任务执行周期 以定时器进入中断的频率为基准
 */
bool TaskAdd(VoidVoidFuncPtr ptrTaskFunc, uint16_t usTaskCycle)
{
	STR_TASK_T *pstTask = stTaskBuff; // Pointer to stTask

	for (int i = 0; i < TASK_NUM_MAX; ++i)
	{
		if (pstTask[i].ucId == 0)
		{
			pstTask[i].ulTaskCycle = usTaskCycle;
			pstTask[i].ptrTaskFunc = ptrTaskFunc;
			pstTask[i].enTaskState = kTaskSleep;
			pstTask[i].usTaskCount = 0;
			pstTask[i].ucId = i + 1;
			return true;
		}
	}
	return false;
}
